#ifndef SERVIDOR_H_
#define SERVIDOR_H_

#include "../common/Sockets/Socket.h"
#include "../common/Threads/Thread.h"
#include "BattleMasterInterface.h"
#include <iostream>
#include "Welcomer.h"
#include "ColaClientes.h"
#include "ColaMensajes.h"
#include "../common/Sockets/Recever.h"
#include "../common/Sockets/Sender.h"

class Servidor : public Thread{
private:
	bool conectado; // Estado del servidor, condicion de corte

	/*
	 * Recibe los nuevos clientes y los agrega a la lista de clientes
	 */
	Welcomer* conexiones;

	/*
	 * Cola de clientes
	 */
	ColaClientes* clientes;
	

	/*
	 * Cola de mensajes
	 */
	ColaMensajes* mensajesServer;


	/*
	 * Interfaz del Juego
	 */
	BattleMasterInterface* game;



	void propagarDTO(DTO* dto);


protected:
	virtual void* run();

	void escucharConexiones(unsigned int puerto,unsigned int maxConexiones);



public:
	Servidor(BattleMasterInterface* game);

	/**
	 * Deja al socket escuchando conexiones por el puerto indicado
	 */
	void iniciar(unsigned int puerto,unsigned int maxConexiones = 1);

	/**
	 * Setea la condicion de corte en false, deja de aceptar conexiones
	 * Y termina las existentes
	 * Guarda el estado del sistema.
	 */
	void terminar();

	bool isRunning();

	virtual ~Servidor();
};

#endif /* SERVIDOR_H_ */
